package com.tedu.review.day02;

/**
 * 抽象类的特点：<补充>
 *             抽象类=类：成员变量+构造器+成员方法
 *             成员变量：既可以是变量，也可以是常量
 *             构造方法：有
 *             用于子类访问父类的数据【父类默认初始化】
 *             成员方法：既可以是抽象也可以是非抽象的
 *  抽象方法的特性：
 *  A：抽象方法 -------目的：强制子类做的事情（子类一定重写）
 *  B：非抽象方法-------目的：子类继承的事情，提高代码复用性（与普通的父类一样）
 */

abstract class Foo{
    //成员变量
    public int i=10;
    //成员变量修饰加上final  也可以交常量[识别常量：标识符全大写]
    public final int J=20;//Java强类型语言：标识符大小写分明
    public int j=30;
    public Foo() {//创建对象同时一并创建：初始化--传输成员变量数据
        this(30);//this()调用本类其他构造器，调用有参数--当前属性/成员变量重新赋值
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象【重写】、非抽象【提高复用-继承父类】
    public abstract void show();
    public void method(){
        System.out.println("Foo-----method");
      }
}
//无法实例化【无法直接创建对象】--继承--多态性---利用造型
//Goo  子类【实现类】继承 抽象类 子类必须重写抽象类中所有抽象方法
class Goo extends Foo{

 @Override
 public void show() {
 System.out.println("show Goo");
    }
  public void method(){
  System.out.println("Goo method");
      }

  public Goo() {
  super();
      }
  }
 public class 抽象类特点1 {
 public static void main(String[] args) {
  //创建对象---实例化
 Foo f=new Goo();
        //①实例化--初始化Goo()构造器，类默认存在空构造器
        //②空构造器默认存在：super() 调用父类的无参构造器
        //③父类无参构造器中存在：this()  调用本类有参构造器
        //this(参数)给Foo抽象类的i值进行覆盖   i=30
 System.out.println("f.i"); //⑤引用调取i值  打印30
        //调取抽象类常量，不可以给常量赋值
 System.out.println(f.J);

        //---------------------------------------------------
 f.show();   //抽象方法        一定被子类重写    Goo show
 f.method(); //非抽象方法       选择实现重写      Foo  show
     }
   }